home *** CD-ROM | disk | FTP | other *** search
/ Aminet 7 / Aminet 7 - August 1995.iso / Aminet / comm / term / XPRZ35R.lha / docs / XPRzmodem.Doc < prev    next >
Text File  |  1995-01-14  |  42KB  |  817 lines

  1.  
  2.                     Documentation for XPRZModem.library
  3.                             by Rick Huebner
  4.                     with additions for XPRzedzap.library
  5.                           by Robert Williamson
  6.  
  7. |---
  8. |           Update comments for XprZmodem.Library
  9. |    Version 2.50 Update, 15 November 1991, by William M. Perkins
  10. |    Version 2.51 bug fix, 29 January 1992, by John Tillema
  11. |    Version 2.52 recompiled, 6 March 1992, by William M. Perkins
  12. |     Proto additions for the SAS 5.10B Compiler by Jim Cooper
  13. |    Version 2.61 recompiled, 4 July 1993, by Rainer Hess
  14. |     Little Bugfix for SAS/C 6.x used SAS/6.3 also changed
  15. |     Funktion mysprintf() to xprsprinf() now written in Assembler
  16. |    Version 2.62 - Bulid in variable Blocksize
  17. |    Version 2.63 - Now localeized if you use WB2.1 or 3.x you can
  18. |     use this future. On this time will only a german catalog
  19. |     avaiable, default will be english or if you use a older
  20. |     Kickstart/Workbench.
  21. |    Version 2.64 - Bug fix in function update_rate(), save of GURU
  22. |     #80000005 on little files eg. 2 Bytes. Compiled Librarys for
  23. |     all prozessors (68000/010/020/030/040), for kick 1.x and
  24. |     up to 2.x, by Rainer Hess
  25. |    Version 3.0 - Now it's time, i think, to make a new version
  26. |     number, this will be a full release.
  27. |    Version 3.1, - Documentation update by Geoffrey Faivre-Malloy
  28. |      Conversion of documentation to Amigaguide format.
  29. |     Code-Changes by Rainer Hess:
  30. |     ZModem runs always with the sender blocksize or uses standart-mode
  31. |     (M1024) if there is on one system a older zmodem.
  32. !   Version 3.2 - added DirectZap, Zedzap, ZedZip and SZmodem  protocols. 
  33. !                 added XPR3 update_status support
  34. !                 FTN mailer support  
  35. |    Robert Williamson
  36. !   Version 3.3 - added support for dual-status window (XPR2.001)
  37. |    Robert Williamson
  38. |---
  39.  
  40. |---
  41. |    All of my additions to this documentation are indicated by
  42. |  <--  this left margin braketing.   -WMP-
  43. |---
  44.  
  45. !    All my additions to this documented are indicated by
  46. !     <--  this left margin braketing.   Robert Williamson
  47.  
  48. 1.  Introduction (or "What is this thing, anyway?")
  49. ---------------------------------------------------
  50.  
  51.      XPRZModem.library  is  an  Amiga  shared  library (with full Lattice C
  52. source  code)  which  provides  ZModem  file  transfer  capability  to  any
  53. XPR-compatible  communications program.  The XPR external protocol standard
  54. describes  an interface method which allows various file transfer protocols
  55. to  be  implemented  as  Amiga  shared  libraries  which  may  then be used
  56. interchangeably  in  any  compatible  communications program.  This takes a
  57. heavy  load  off  of  the comm program author, who no longer has to support
  58. scads  of different file transfer protocols (many of which are quite tricky
  59. to  code)  in  their program in order to make it widely useful and popular.
  60. The  comm program is also smaller and more efficient as a result, since all
  61. those obscure protocols (you know, the ones *you* don't need) are no longer
  62. taking  up space.  The XPR standard also helps users, who can mix and match
  63. their  favorite  file transfer protocols (and implementations thereof) with
  64. their  favorite  comm  programs.   And when new protocols are invented, the
  65. user  simply  plugs  in  a  new  library,  and  voila!,  it's ready to use.
  66. Hopefully, making protocols easy to support will allow more and better comm
  67. programs  to  be  written,  as  authors  can  concentrate on their programs
  68. instead of constantly re-inventing the wheel.
  69.  
  70.      Of  course,  for all of this wonderful stuff to happen, there needs to
  71. be  a  good  selection  of  these  XPR  protocol libraries available to the
  72. public.   It's  the  classic  chicken-and-egg problem; comm program authors
  73. won't  be  motivated  to support the XPR standard unless there are a goodly
  74. number  of  protocols  available  for  it.   And other programmers won't be
  75. motivated  to  write XPR protocol libraries until there are a goodly number
  76. of comm programs which can use them.  In an effort to do my bit [ B^) ] for
  77. the Amiga community, which has given me so many neat toys to play with over
  78. the past few years, I decided to try and help get the ball rolling.
  79.  
  80.      Hopefully,  the  early  availability  of  a  ZModem  library will help
  81. stimulate interest in the XPR standard, resulting in better Amiga telecomms
  82. for  all  of  us.   And  by making my source code PD, I hope to help others
  83. interested  in  writing  XPR protocol libraries by giving them some serious
  84. example  code.   Also, having ZModem library code readily available to John
  85. Q.   Hacker  should help ensure a steady stream of new lemon-fresh enhanced
  86. ZModem libraries (with enzymes) for all of us to use in the future.
  87.  
  88.      Of course, no discussion of the XPR standard would be complete without
  89. giving  proper credit to the author, Willy Langeveld of the Stanford Linear
  90. Accelerator  Center.  Many thanks are due him for this effort.  If you have
  91. any  further  questions  about  the  XPR standard, be sure and download the
  92. spec;  it should be available on BIX (since he's a sysop there), or on most
  93. other major systems.  And I'll try to keep the current version available on
  94. my BBS, as well.
  95.  
  96.      All  files  in  this  archive  which  are  not  copyrighted are hereby
  97. released  to the public domain (which they were anyway, by way of not being
  98. copyrighted,  but  I  want  to make sure YOU realize that).  Do as you like
  99. with  them.   Please  make  lots of copies and distribute them all over the
  100. place,  and  make  lots of derivative works, and everything!  Heck, you can
  101. even publicly perform and/or display this code if you can figure out how...
  102.  
  103.  
  104.  
  105. 2.  Installation (OK, enough chatter; let's get to work)
  106. --------------------------------------------------------
  107.  
  108. !   If  intended  use  is  in  a  Mailer,  use xprzedzap.library, selecting
  109. !appropriate   CPU   version   for   your   system.    You   may  also  use
  110. !xprzedzap.library  in  the  place  of  xprzmodem.library in both BBS's and
  111. !terminal programs. 
  112.  
  113.      Couldn't  be  easier.   Just copy the xprzmodem.library file into your
  114. LIBS:   directory.   All  XPR-compatible comm programs should provide a way
  115. for  you to select which XPR protocol you wish to use, either by giving you
  116. a  file  requester showing LIBS:xpr*.library, or by automatically detecting
  117. these libraries and adding them into their menus.
  118.  
  119. WARNING:   Versions  of  VLT  prior  to  revision  4.107  had  a bug in the
  120. xpr_sflush()  routine  which  caused random Guru 3 crashes on some systems.
  121. If  you're using a version of VLT older than 4.107, it would be a good idea
  122. to  upgrade  to  the  latest rev.  Besides, there's a bunch of new features
  123. you're missing, anyway...
  124.  
  125. ANOTHER  WARNING:   Versions  of  VLT  prior  to  5.034  had  a  bug in the
  126. xpr_sread()  function  which  caused  them  to (at least sometimes) fail to
  127. return  any bytes received so far when an xpr_sread() call timed out.  This
  128. version  of  XPRZModem.library  requires VLT version 5.034 or later.  (Yes,
  129. Willy, it really was broken B-))
  130.  
  131. |---
  132. |    XprZmodem.Library version 2.50 and 2.52 tested with WTerm version
  133. |    0.82 and Willy's term program, VLT version 5.045.  No problems
  134. |    occurred.  It should work fine with any term program that was able
  135. |    to work with the version 2.10 of XprZmodem.Library.    -WMP-
  136. |---
  137.  
  138. !   xprzedzap.library  was  tested with TERM and with the Roff and Porticus
  139. Shelter Mailers.
  140.  
  141. 3.  Options
  142. -----------
  143.  
  144.      The  XPR  standard  lays  out  two  ways  for the comm program user to
  145. specify options for the XPR protocol.  The more primitive option is for the
  146. comm  program  to  provide  a method of passing an option string to the XPR
  147. library  before  transferring  files.  The precise format and usage of this
  148. option  string is left up to the XPR protocol author; the comm program just
  149. sends  it verbatim.  If an environment variable is found with the same name
  150. as  the  XPR  protocol  (i.e.  there's a file in the ENV:  directory called
  151. "xprzmodem"),  the comm program is supposed to use this string (contents of
  152. file) to initialize the protocol options.  Also, a menu option or some such
  153. should  normally  be  provided which will allow the user to be prompted for
  154. the option string interactively.
  155.  
  156.      Version  2.0 of the XPR standard created a new, more sophisticated way
  157. for  the  comm  program  user  to specify XPR options.  If the comm program
  158. supports  it,  the  XPR  library can give the comm program a list of option
  159. prompts,  and  the comm program can then let the user interactively set the
  160. various options individually, possibly even using nice gadgets and stuff.
  161.  
  162.      In  any  case,  no  matter how your particular comm program feels like
  163. handling  it,  these  are  the  options supported by this implementation of
  164. ZModem:
  165.  
  166.           T{Y|N|?|C}   Text translation mode:
  167.              TY = Text Yes; if receiving, translate CR/LF pairs or solo
  168.                   CR chars to normal Amiga LF chars.  Ignore data past ^Z.
  169.                   If sending, suggests to receiver that they should receive
  170.                   this file in text mode.
  171.              TN = Text No; receive file verbatim, without changes.  If
  172.                   sending, suggest to receiver that they receive this
  173.                   file verbatim, without translations.
  174.              T? = Text status unknown; if receiving, use sender's
  175.                   suggestion as to whether to do EOL translations or not.
  176.                   If sending, tell receiver to use default mode, 'cause we
  177.                   don't know either.
  178.              TC = Text mode set by Comm program; the library asks the comm
  179.                   program whether or not to use Text mode for each file.
  180.                   If the comm program doesn't support the necessary
  181.                   xpr_finfo() call, or if the call fails, this option acts
  182.                   like T?.  From the user's point of view, what this option
  183.                   normally does is set the Text mode to match the comm
  184.                   program's built-in text/binary/end-of-line/translation
  185.                   mode, if any.
  186.  
  187.           O{Y|N|R|S}  Overwrite mode:
  188.              OY = Overwrite Yes; if about to receive file with same name as
  189.                   one which already exists, delete the old file and receive
  190.                   the new file in its place.
  191.              ON = Overwrite No; if about to receive file with same name as
  192.                   one which already exists, append ".dup" onto the name of
  193.                   the new file to keep them separate.
  194.              OR = Overwrite Resume; if about to receive file with same name
  195.                   as one which already exists, resume receiving file data
  196.                   from the current end of the existing file.
  197.              OS = Overwrite Skip; if (etc.), tell sender never mind, skip
  198.                   this file, we don't want it.  Batch transfers will move
  199.                   on to the next file in the set, if any.
  200.  
  201.           Bnnn   Buffer size:
  202.              XPRZModem.library adds a layer of file I/O buffering in
  203.              addition to whatever the comm program may or may not provide.
  204.              This option sets the size of XPRZModem's file I/O buffer in
  205.              kilobytes.  The minimum value is 1 KB, for those using RAM
  206.              drives or fast hard drives, or those whose comm programs
  207.              already provide sufficient buffering.  The maximum value is
  208.              as much contiguous RAM as you have available in your Amiga.
  209.              If you specify more than is actually available, XPRZModem will
  210.              keep decrementing the buffer size requested by 1 KB until the
  211.              memory allocation works.  That way, if your RAM is too
  212.              fragmented to use the amount you request, XPRZModem simply
  213.              uses the largest block available.  Buffering is especially
  214.              helpful for floppy drive users; it keeps your drive from
  215.              continuously gronking and slowing things down all through the
  216.              transfer.  NOTE: Versions of VLT prior to 5.034 couldn't handle
  217.              buffer sizes >= 32 KB.  If you wanted to use larger buffers
  218.              before and couldn't, try again now.
  219.  
  220.           Fnnn   Frame size:
  221.              Although normally avoided, ZModem has the ability to require
  222.              an ACK to be sent from the receiver to the sender every X-many
  223.              data bytes.  Normally you don't want to use this feature,
  224.              because not waiting for ACKs is part of how ZModem works so
  225.              fast.  However, this feature can be very useful in conjunction
  226.              with file I/O buffering on slow devices (namely those floppy
  227.              drives).  If you set up a large I/O buffer to avoid gronking
  228.              your floppy so often, you'll find that when the buffer finally
  229.              *does* get around to being flushed that it can take a looonng
  230.              time; so long, in fact, that the delay can cause timeouts and
  231.              errors.  But if you set your ZModem to require the sender to
  232.              wait for an ACK every buffer's-worth of data, the sender will
  233.              politely wait for you to flush your buffer to the slow floppy
  234.              and send it an ACK saying it's OK to continue now.  This value
  235.              should be set to 0 to disable ACKs (normal mode), or set it to
  236.              the actual number of data bytes allowed between ACKs.  For
  237.              example, if you set B64 because of your floppy, you should
  238.              also set F65536.
  239.  
  240.           Ennn   Error count:
  241.              This allows you to set the number of sequential errors which
  242.              will be required to convince ZModem to abort the transfer.  The
  243.              normal value is 10, meaning that 10 errors must happen in a row
  244.              with no valid data being transferred in order to cause an abort.
  245.              This setting is provided for those using XPRZModem with a BBS,
  246.              who may wish to use a relaxed setting, or those with really
  247.              lousy phone lines who are desparate and patient enough to want
  248.              the transfer to continue in spite of horrible performance.
  249.  
  250.           A{Y|N}   Auto-activate mode:
  251.              AY = Auto-activate Yes; if the comm program supports the
  252.                   ability, the library will automatically go into receive
  253.                   mode when the start of a ZModem download is detected.
  254.              AN = Auto-activate No; don't try to automatically start
  255.                   downloading, make the user activate it.
  256.  
  257.           D{Y|N}   Delete after sending:
  258.              DY = Delete Yes; delete each file after it has been
  259.                   sucessfully sent.
  260.              DN = Delete No; don't delete files after sending them.
  261.  
  262.           K{Y|N}   Keep partial files:
  263.              KY = Keep Yes; keep the fragment of a file received so far
  264.                   if file reception is aborted.  This allows you to use the
  265.                   Overwrite Resume option above to pick up where you left
  266.                   off on your next attempt.
  267.              KN = Keep No; delete any partially-received file after an
  268.                   aborted transfer.
  269.  
  270.           S{Y|N}   Send full directory path:
  271.              SY = Send path Yes; send full filenames including directory
  272.                   path to receiver.
  273.              SN = Send path No; send only simple filenames, not including
  274.                   directory path.
  275.  
  276.           R{Y|N}   Receive full directory path:
  277.              RY = Receive path Yes; use full filename exactly as received,
  278.                   instead of using the P option directory path.
  279.              RN = Receive path No; ignore received directory path (if any),
  280.                   use P option directory path instead.
  281.                                
  282.           P{dir}   Path to use for received files:
  283.              Px = Store all received files in directory "x" if option RN
  284.                   set.  Ignored if option RY set.  "x" can be any valid
  285.                   existing directory, with or without trailing "/"
  286.                   (e.g. "Pdf0:", "PComm:hold", etc.).
  287.  
  288. !         M{size}  Maximun Block size for file transfer:
  289. !            Mx = Size of Block to transfer. Default of ZModem is 1024,
  290. !                 Minimum is 64 Bytes, Maximum is 8192 Bytes (8K).
  291. !                 Be carefull with this option. If the uploaders blocks are
  292. !                 bigger than the receiver you will get errors and very
  293. !                 poor cps rates.
  294. !                 This option is normally used only in FTN mode, but may
  295. !                 be used in terminal abd BBS modem to replace the 
  296. !                 XPRSZmodem.library.
  297. !                 The block size will vary when sending and will be static
  298. !                 when receiving.
  299. !                 When sending the maximum packet size will be baud rate
  300. !                 dependant, and the size is calculated with the formula 
  301. !                   MAX_PACKET = (BPS_RATE * 8192 / 9600).
  302. !                 You can specify a limit for the maximum packet size with
  303. !                 the M option, but it only influences the packet size if
  304. !                 it is smaller than 8192 or if one is receiving a file 
  305. !         (NOTE:  It should always be set to 8192 if one is receiving a file.
  306. !         But the option in there to limit it to less).
  307. !         The IO Buffer for reading/writing to/from the disk must be equal
  308. !         to twice the maximum packet size or the maximum packet size will
  309. !         be automatically decreased.
  310. !
  311. !
  312. !         C{link bps}  Set bps rate of link
  313. !           C0 Buffer allocations and calculations of CPS will be based
  314. !              upon locked rate passed by the comm program.
  315. !           Cx Buffer allocations and calculations of CPS will be based
  316. !              upon link rate.
  317. !
  318. !         N{Y|N}  Start transfer even if no files to send:
  319. !            NY  send no files mode (DirectZap, ZedZip and ZedZap protocols)
  320. !                It is permitted to have a session without sending or
  321. !                receiving files.  This is required with some protocols in
  322. !                FTN mode so as not to generate a spurious failure after a
  323. !                mailer session.  This also changes EOF actions from sending
  324. !                CAN's to just sending ZFIN.
  325. !           NN   transfer will not take place if not files to send.   
  326. !
  327. !         Q{Y|N}  DirectZap protocol mode:
  328. !           QY   Only ZDLE and ZDLEE are escaped.
  329. !           QN   Normal escapeing is done.        
  330. !
  331. !         Z{Y|N}  FTN mode
  332. !           ZY
  333. !            - RxTimeOut is restored to 600ms
  334. !            - transfers start with blocksize specified in M option.
  335. !            - serialbuffer is cleared before sending/recving.  In FTN
  336. !              mode the turnaround from sending to receiving (and vis-versa)
  337. !              is quite fast, clearing the buffer avoids reading echos of our
  338. !              own characters or leftovers from the previous transfer.
  339. !           ZN none of the above take place
  340. !
  341. !
  342. !         Y XPR2001 Mode    
  343. !
  344. !            Y{Y|N}  XPR2001 mode
  345. !              Y - When enabled, calls to XprSetup() will return a mask with
  346. !                 the  additional  bits defined in the XPR 2.001 spec related
  347. !                 to  double-buffering,  etc.   xpr_update()  calls  will  be
  348. !                 masked  with  a  bit  indicating  directionof  transfer  to
  349. !                 support   host   program   rthat  use  dual-staus  windows.
  350. !
  351. !              N - XPR2001 support diabled, required for Ncomm, Excelsior
  352. !                  BBS and other hosts which do not properly handle xpr
  353. !                  function and callbacks return codes.
  354.  
  355.  
  356.      If setting the options via the option string method (either ENV:  file
  357. or  primitive  comm  program),  note  that the setting for each option must
  358. immediately  follow  the  option  character  with no intervening characters
  359. ("TY",  not  "T  Y"  or  "T=Y").   When  setting  multiple options at once,
  360. separate  the  options  from  each  other  with  commas  and/or spaces; for
  361. example, "TN,OR,F0".  You don't have to specify all options every time; the
  362. options  you  specify  will  be  merged  into  the current option settings,
  363. replacing  their  old  values.   Upper/lower  case is not significant. 
  364.  
  365. !     Default Options: xprzedzap.library
  366. !     
  367. !    TN       No Text translation
  368. !    OR       Overwrite Resume
  369. !    B16      Buffer size 16KB 
  370. !    F0       Frame size = filelength 
  371. !    E30      Error count 30 
  372. !    SN       Do not send full directory path  
  373. !    RN       Do not use received full directory path  
  374. !    AN       Disable Auto-activate mode  
  375. !    DN       Do not Delete after sending  
  376. !    KY       Keep partial files  
  377. !    P""      Comm progrmas provides Path to use for received files  
  378. !    M8192    Maximum packet size 8K 
  379. !    C0       Set Link BPS Rate  
  380. !    NY       Alow Send if there are no files  
  381. !    QN       Disable DirectZap escape only CAN  
  382. !    ZY       Enable FTN mode  
  383. !    YY       Enable XPR2001 extensions
  384. !
  385. !     Default options: xprzmodem.library
  386. !
  387. !    TC       Comm Program Sets Text translation mode
  388. !    ON       Overwrite No
  389. !    B16      Buffer size 16 KB
  390. !    F0       Frame size = filesize
  391. !    E10      Error count 10
  392. !    SN       Do not Send full directory path
  393. !    RN       Do not use Received full directory path
  394. !    AY       Enable Auto-activate mode
  395. !    DN       Do not Delete after sending
  396. !    KY       Keep partial files  
  397. !    P""      Comm program sets Path to use for received files  
  398. !    M1024    Set maximum packet size 1K
  399. !    C0       Set Link BPS Rate  
  400. !    NN       Do not Send if there are no files  
  401. !    QN       Disble DirectZap escape only CAN  
  402. !    ZN       Disable FTN mode
  403. !    YY       Disable XPR2001 extensions
  404.  
  405.      If  the  comm program supports the xpr_options() call added in version
  406. 2.0  of  the  XPR  spec, you should be prompted for each option with a nice
  407. prompt  message  such as "Text mode (Y,N,?,C):" and possibly be able to use
  408. Intuition  string  and/or  button  gadgets  instead of being stuck with the
  409. semi-cryptic option string format described above.
  410.  
  411.  
  412.  
  413. 4.  Serial port settings
  414. ------------------------
  415.  
  416.      ZModem  (at least this implementation of it) requires that your serial
  417. port  be  set to 8 data bits, no parity, 1 stop bit.  This allows ZModem to
  418. send  full  8-bit  binary  data bytes without having them munged on the way
  419. through  the  modem.   If  your  comm  program supports the xpr_setserial()
  420. function, XPRZModem will use it to set your serial port to 8N1 before doing
  421. a  transfer,  and  will  set your port back the way it was again after it's
  422. done.  If your comm program doesn't support xpr_setserial(), you'll need to
  423. make sure it's in 8N1 mode yourself.
  424.  
  425.      ZModem  works  well  in  all  serial  port  handshaking  modes;  none,
  426. XON/XOFF,  or  7-wire/RTS/CTS.  Since any or all of those handshaking modes
  427. may  be  appropriate  at  different  times, with different modems or remote
  428. systems,  XPRZModem lets you set the handshaking mode and doesn't mess with
  429. it.
  430. !    XON-XOFF MUST be disabled when using DirectZap (option QY)
  431.  
  432.  
  433.  
  434. 5.  Receiving files
  435. -------------------
  436.  
  437.      Once you get the ZModem options and your serial port configuration set
  438. up  properly,  you're  ready to actually use this thing (gasp!).  Receiving
  439. files  via  ZModem  is  quite  simple.  First, get the file sender going by
  440. using whatever command it wants.  ZModem is a batch file transfer protocol,
  441. meaning  that  it's  capable  of  transferring  several  files  in a single
  442. exchange,  so  the remote system may allow you to specify multiple files to
  443. be  sent  to  you  at  one  time.   It  may  also allow you to use wildcard
  444. characters in the filename(s); this is all system dependant.
  445.  
  446.      This  may  be  all  you  have  to  do.   If  you  specified  option AY
  447. (auto-activate  on),  and  your  comm program supports it, XPRZModem should
  448. automatically  activate  at  this point and start receiving your files.  If
  449. you specified AN, or your comm program doesn't support auto-activation, you
  450. should  now use whatever option your comm program provides to activate file
  451. reception;  this  will  usually  be a menu option or button gadget.  Either
  452. way, once XPRZModem starts receiving files, it should automatically receive
  453. all  of  the  files you specified into the proper directory as indicated by
  454. the R and P options.
  455.  
  456.      Make  sure  that  you  have  set  the  ZModem  options properly before
  457. starting  the  transfer;  especially, make sure you only use TY if you know
  458. that  all  of the files being transferred in this batch are printable ASCII
  459. text  files.   If  you  use  TY on normal binary files like .ARCs or .ZOOs,
  460. they'll be mangled beyond use.
  461.  
  462.  
  463.  
  464. 6.  Sending files
  465. -----------------
  466.  
  467.      Sending files using ZModem is fairly straightforward.  First, activate
  468. the  file  receiver  with whatever command the remote system requires.  You
  469. may  or  may  not  need  to  specify  a filename or directory to the remote
  470. system;  this  depends  on their implementation of ZModem.  Once the remote
  471. system  is ready to receive files, activate your comm program's ZModem send
  472. function.   Your  comm  program  will prompt you for which file(s) to send.
  473. Although ZModem is a batch protocol, your comm program may or may not allow
  474. you  to  specify multiple file names to be sent; also, wildcards may or may
  475. not  be  supported.   These  decisions  are  up to the comm program author;
  476. ZModem  will handle multiple files and wildcards if the comm program allows
  477. them.   Once you've specified the file name(s), the file(s) will be sent to
  478. the  remote  system.  Note that the T option serves only as a suggestion to
  479. the  receiving  system  when  sending  files;  the receiver makes the final
  480. decision  as  to  whether  to  take your advice or to force the files to be
  481. received in text or binary mode.
  482.  
  483.      If  errors  occur  while sending the file(s), you'll probably notice a
  484. small  enhancement  I  made to the normal ZModem error recovery procedures.
  485. Normally, file transfer protocols have to compromise between efficient data
  486. transmission  on  good,  clean phone lines and quick error recovery on bad,
  487. noisy  phone  lines.   If  you  pick  a  large  packet  size,  you get high
  488. throughput  on  clean  lines  due to low packet overhead, but you have slow
  489. recovery  times and large amounts of retransmitted data on noisy lines.  If
  490. you've  used  YModem  on noisy lines you've seen this problem.  But, if you
  491. use small packets to reduce retransmitted data on noisy lines, you increase
  492. the  amount  of  time the protocol spends sending packet overhead, and your
  493. throughput  suffers.   The  solution is to vary the block size according to
  494. the  experienced error rate during the transfer.  That way you aren't stuck
  495. with a rigid packet length which will sometimes be the wrong size no matter
  496. what.  I came up with this idea back when I first wrote the ZModem code for
  497. Opus, and cleared it for future compatibility with ZModem's designer, Chuck
  498. Forsberg,  back  then.   Since  then the basic concept has been extensively
  499. tested  in the Opus BBS system, and has proven quite effective; it has also
  500. been incorporated into various other ZModem implementations over time.  The
  501. actual  algorithm for deciding what size packets to use when is pretty much
  502. up  to  the  protocol author; XPRZModem uses a modified version of the Opus
  503. algorithm  which  prevents  locking the packet size at a small value when a
  504. large one-time burst of errors occurs.
  505.  
  506.  
  507.  
  508. 7.  Notes for comm program authors
  509. ----------------------------------
  510.  
  511.      That's  pretty  much  everything  you  need  to  know  in order to use
  512. XPRZModem  properly.   Here  are  some  notes  for the "other" XPR standard
  513. users, namely the comm program authors:
  514.  
  515.      Certain  XPR  callback  functions  *must*  be  implemented by the comm
  516. program  author  in  order  for  XPRZModem  to  be  used.   If any of these
  517. functions are not supported by your comm program, XPRZModem will display an
  518. error message and abort when invoked.  These required functions are:
  519.  
  520.           xpr_fopen(), xpr_fclose(), xpr_fread(), xpr_fwrite(),
  521.           xpr_fseek(), xpr_sread(), xpr_swrite(), and xpr_update()
  522.  
  523. !     In  addition, for FTN operation , the XPR v3 xpr_updstatus function is
  524. !required.   The  library  will  NOT abort if your program does not have it.
  525. !This  function  provides  transfer status to the host program for EACH file
  526. !sent and received.
  527.  
  528.      The  xpr_update()  function  provides  many  data fields for your comm
  529. program  to  potentially  display  to  the  user.  These are the XPR_UPDATE
  530. struct elements which XPRZModem will keep updated during transfers:
  531.  
  532.           xpru_protocol, xpru_filename, xpru_filesize, xpru_msg,
  533.           xpru_errormsg, xpru_blocks, xpru_blocksize, xpru_bytes,
  534.           xpru_errors, xpru_timeouts, xpru_blockcheck, xpru_expecttime,
  535.           xpru_elapsedtime, and xpru_datarate
  536.  
  537.      As  you  can  see, XPRZModem tries to provide as many status fields as
  538. possible.   Although  all  of  them  are  useful,  the  ones which are most
  539. important  to ZModem users are filename, filesize, msg and/or errormsg, and
  540. bytes.  Please try to provide at least these fields in your status display,
  541. plus as many of the rest as you can manage.
  542.  
  543. !     With this version the Protocol name sent to the Status Display will be
  544. !one of:
  545. !        Zmodem      1K blocks standard, non-ftn mode
  546. !        ZedZap      up to 8K Blocks based upon bps rate, ftn mode
  547. !        ZedZip      1k blocks , ftn mode
  548. !        DirectZap   up to 8k blocks, minimum escaping, ftn mode
  549. !
  550. !    Also  note that During batch transfers, the Last Error message field is
  551. !set to "None" when starting to send or receive next file.  This is to aviod
  552. !the  confusion  caused  by  an error message from a previous file not being
  553. !cleared.
  554.  
  555.  
  556.      Although  only the XPR callback functions listed above are crucial for
  557. XPRZModem,  almost  all  of  them  are used if they are provided.  Although
  558. XPRZModem  will function without any of the other routines, its performance
  559. or  capabilities  may be degraded somewhat.  Specifically, this is what you
  560. give  up  if  you  choose  not  to  supply  any of these other XPR callback
  561. functions:
  562.  
  563.           xpr_sflush(): Used when performing error recovery and resync
  564.                when sending files.  If not provided, extra timeout errors
  565.                and delayed error recovery will be likely.  The files will
  566.                still be transferred properly, but errors will degrade
  567.                overall throughput more than usual.
  568.  
  569.           xpr_chkabort(): Called between sending or receiving packets.
  570.                If not provided, there's no way for your comm program user
  571.                to abort a transfer in progress except by trying to somehow
  572.                force it to decide to give up and abort on its own, such as
  573.                by turning off the modem and hoping the protocol will abort
  574.                after enough timeouts (it will, eventually...).
  575.  
  576.            xpr_gets(): Called to prompt the user interactively for options
  577.                when your comm program invokes XProtocolSetup() with a null
  578.                xpr_filename field (if xpr_options() isn't available
  579.                instead).  If not provided, you'll have to prompt
  580.                the user for the options string yourself, and pass this
  581.                string in xpr_filename when invoking XProtocolSetup().
  582.  
  583.            xpr_setserial(): Called to obtain the current serial port
  584.                settings, and to change the serial port to 8N1 if it's not
  585.                already set that way.  If not provided, XPRZModem will
  586.                assume all transfers are being done at 2400 bps, which
  587.                won't hurt anything, and your users will have to make sure
  588.                that the serial port is set to 8N1 themselves.
  589.  
  590.            xpr_ffirst() and xpr_fnext(): If either of these routines are
  591.                missing, XPRZModem will lose the ability to send multiple
  592.                files in a batch.  The xpr_filename pointer passed to
  593.                XProtocolSend() will be assumed to point to the actual full
  594.                filename of the single file to be sent in this batch.  If
  595.                both of these routines are provided, XPRZModem will rely
  596.                upon them completely to obtain the names of the files to
  597.                send, and the xpr_filename pointer will not be used for any
  598.                purpose by XPRZModem except to be passed to ffirst/fnext.
  599.                This gives your comm program a way to send not just a single
  600.                filename template's worth of files in a batch, but a list of
  601.                different filenames.  If, for example, you set xpr_filename
  602.                to point to the first node of a linked list of filenames
  603.                and/or templates to be sent, rather than just having it
  604.                point to a string, you can have your ffirst and fnext
  605.                routines traverse this linked list in order to determine the
  606.                next file to be sent.  Or you could have xpr_filename point
  607.                to a buffer containing a list of filenames separated by
  608.                commas, and your ffirst/fnext routines could return each
  609.                filename in this list in turn.  The key here is that if you
  610.                provide these two routines, you're in complete control over
  611.                the series of names fed to XProtocolSend.  If you omit these
  612.                routines, XPRZModem is stuck with single-file mode.  Once
  613.                again, if these two routines are provided, XPRZModem will
  614.                *always* call them; it makes no attempt to use the
  615.                xpr_filename pointer for anything itself.  This is not
  616.                explicitly spelled out in the XPR standard, but it seems the
  617.                only reasonable way to handle batch protocols to me.
  618.                Hopefully other XPR library authors will follow this
  619.                precedent as well, so that comm program authors will be able
  620.                to count on multiple-filename batch sessions being handled
  621.                properly.
  622.  
  623.            xpr_finfo(): Used to determine the filesize of files being sent,
  624.                in order to tell the receiving system how big they are.
  625.                Also used to determine the size of a file which already
  626.                exists when in Overwrite Resume mode; XPRZModem must be able
  627.                to get the size of the current portion of the file in order
  628.                to be able to tell the sender where to resume sending from.
  629.                If this routine isn't provided, Overwrite Resume mode is
  630.                not allowed.  This routine is also used to check if Text
  631.                mode should be set to Y or N for each file when option TC
  632.                is set.
  633.                
  634.            xpr_options(): If you don't supply this, users will be stuck
  635.                with setting the library options via the semi-cryptic text
  636.                string method (ENV: and/or xpr_gets()).  This routine and
  637.                xpr_update() have a lot to do with the look and feel of your
  638.                program when using XPR libraries; any skimping on these two
  639.                routines will be painfully obvious to the user.  Conversely,
  640.                doing a nice job on these two routines will really make your
  641.                program shine.
  642.  
  643.            xpr_unlink(): Required by the DY and KN options, so if you don't
  644.                supply it, those options are not allowed.
  645.  
  646. !     All  callbacks  are  protected  so  we  are  able to call XPR callback
  647. !functions  in  the comm program from inside the XPR library.  This protects
  648. !our  registers  from  potential bugs in the comm program which might change
  649. !them  in  unexpected ways.  The prototypes in xprzmodem.h put all arguments
  650. !into the registers required by the XPR spec.
  651.  
  652.  
  653. 8.  The future
  654. --------------
  655.  
  656.      I  don't want or expect this to be the last or only XPR ZModem library
  657. available.   There  are  a  lot of less-commonly-used ZModem features which
  658. have  popped  up over the past few years, and many people might like to see
  659. some  of  them  made  available.
  660.      Such  as 32-bit CRC (although I consider CRC-16 perfectly adequate for
  661. the  max  1K  packets  sent by ZModem), full control-character escaping, or
  662. maybe  8th  bit  escaping  to allow use of 7-bit serial channels. 
  663.  
  664. !   32-bit CRC and DirectZap escaping is enabled.  7-bit channel support is
  665. !not.
  666.  
  667.      I didn't want to add a bunch of rarely-used bells and whistles to this
  668. version  of  the  library,  because  I  want  it  to  be  able  to serve as
  669. comprehensible  example  code.   I just want to provide a good solid ZModem
  670. which  reliably  handles  the  majority of people's needs.  Hopefully, this
  671. will  serve as a foundation for future enhanced versions, while providing a
  672. safe fallback for people to come back to if that fancy new enhanced version
  673. (with neo-maxi zoomed weebies) turns out to need some more debugging.
  674.  
  675.      Bug reports, questions, or comments may be sent to me at:
  676.  
  677.           BIX: rahuebner
  678.           Compu$erve: 73105,1022
  679.  
  680.  
  681.      Or, if you think it's important, and you want an answer in less than a
  682. week or two, call my BBS:
  683.  
  684.           The Wind Dragon Inn
  685.           1-402-291-8053, 300-9600+ bps, HST/V.32/V.42
  686.        or 1-402-291-3636, 300-2400 bps
  687.  
  688.      I  check  the  messages on my BBS fairly often, so that's where to get
  689. ahold  of  me  quick.  I'll also try and stock the latest XPR standard spec
  690. and XPR libraries there.
  691.  
  692. |---
  693. |    Any comments about the version 2.50 to 2.52 update code may be
  694. |    directed to me, William M. Perkins on BIX, with mail sent to
  695. |     wmperkins.
  696. |---
  697.  
  698. !    Any comments about the version 3.2 code may be directed to me:
  699. !          Robert Williamson
  700. !          robert@ecs.mtlnet.org
  701. !          FidoNet#1:167/104.0
  702.  
  703. !     Or, if you think it's important, and you want an answer in less than a
  704. !week or two, call my BBS:
  705.  
  706.           The ROOF       14.4bps,v32bis,v42bis,lap-m,mnp
  707.           514-696-6632
  708.           Use the NOTE command to leave me a message.
  709.      
  710. 9.  The past (revision history)
  711. -------------------------------
  712. ! See History for more recent update information.
  713.  
  714. 1.0, 29 July 89:  Original release.
  715.  
  716.  
  717.  
  718. 1.1,  3 August 89:  Fixed zsdata() to send file data packet in one swrite()
  719. call  instead of calling zsendline for every byte, to prevent hammering the
  720. serial.device  with single-byte write requests during uploads, and to speed
  721. up effective data transmission rates.
  722.  
  723.  
  724.  
  725. 2.0,  28  October  89:   Converted  from  Manx  to Lattice C 5.04.  Created
  726. prototypes  and  made  other  tweaks  as  required.   Designed  new library
  727. skeleton  for Lattice code, replacing the old Manx library skeleton.  Added
  728. new  options  TC,  A,  D,  K, S, R, and P.  Added support for xpr_options()
  729. callback routine, and generally brought things up to par with XPR Spec 2.0.
  730.  
  731.  
  732.  
  733. 2.10, 12 February 91:  Fixed the following generally minor problems:
  734.  
  735.   No  longer  munges  A6 register (this was potentially serious), and added
  736. callback  glue  to  ensure  comm  program can't munge OUR registers either.
  737. Decided  that  the  protective  glue  was  much safer than the more elegant
  738. direct invocation used in version 2.0.
  739.  
  740.   Slightly  less transmission overhead (concatenates all output into single
  741. swrites, builds output packets a bit faster).
  742.  
  743.   Considerably  less  receive  overhead;  does a lot more waiting and a lot
  744. fewer sreads, especially at high speed.  WARNING:  this change doesn't work
  745. with  VLT  version 4.846 or earlier (yes, Willy; it really was broken B-)).
  746. This  change  may  or  may not actually do you any good, depending upon how
  747. your comm program implements the xpr_sread() function.
  748.  
  749.   Fixed problems getting synchronized with some systems on uploads.
  750.  
  751.   No longer closes files twice.
  752.  
  753.   Now uses fully-reentrant sprintf() from amiga.lib; no more nasty BSS.
  754.  
  755.   A couple of obscure error messages were > 50 bytes long, causing problems
  756. with  some  comm program's transfer status windows, e.g.  the infamouse VLT
  757. "Incredible Shrinking Status Window."
  758.  
  759.   Stabilized spastic data rate by computing elapsed time more accurately.
  760.  
  761.   Fixed sprintf() error which caused invalid filelength to be sent on uploads.
  762.  
  763.   Aligned all data for optimal performance on 68030++ CPUs (now that I have
  764. my  A3000...   B-)).  Doesn't really make any noticeable difference, but it
  765. makes  us 68030 owners feel better anyway.  I'm also including a version of
  766. the library compiled for the 68020+ CPU, on the same principle.
  767.  
  768.   Now uses .DUP2 instead of .DUP.DUP, etc.
  769.  
  770.   Added config option E for number of errors which cause an abort.
  771.  
  772.   Fixed bogus IO_Torture false alarm concerning timer.device.
  773.  
  774.   Tried to fix an elusive Enforcer hit on reading location 0, but I'm not
  775. sure I really got it, since I had trouble reproducing the problem.
  776.  
  777. |---
  778. |    2.52 version, 6 March 1992: Recompile code for 68020 library code.
  779. |    Non-68020 code worked fine but John Tillema was not able to test
  780. |    the 2.51 68020 version.
  781. |
  782. |    2.51 version, 29 January 1992: Rxtimeout changed from 600 to 300
  783. |    for upload timeout problem by John Tillema.
  784. |
  785. |    2.50 version, 15 November 1991:  Added code to support 32 bit CRC
  786. |    (Circular Redundency Check).  CRC-32 adds a little more protection
  787. |    to the data being sent and received than does CRC-16.  Source for
  788. |    the CRC-32 additions came from the Unix version of RZ/SZ by Chuck
  789. |    Forsberg.
  790. |
  791. |    Added code to update_rate() function in utils.c to avoid the
  792. |    Guru # 80000005 if you decide to adjust the system clock during an 
  793. |    upload or download from Daylight Saving Time to Standard Time.  :-)
  794. |
  795. |    Proto additions using libinit.o and libent.o, and eliminating all
  796. |    of the assembler code was supplied by Jim Cooper of SAS.  Jim
  797. |    also supplied the mysprintf() code to replace sprintf().  This
  798. |    version of XprZmodem can be compiled with the SAS version 5.10 C 
  799. |    Compiler.  I do not know how well it might compile with the Aztec
  800. |    compiler.
  801. |
  802. |    THINGS TO DO
  803. |
  804. |    - Preserve date of file being transfered.
  805. |
  806. |    - Investigate possibility of saving file protection bits.
  807. |
  808. |    - Work out ways to increase the transfer speed.
  809. |
  810. |    - Additional changes as time and others may suggest.  :-)
  811. |
  812. |    -WMP-
  813. |---
  814.  
  815. ! See History for more recent update information.
  816.  
  817.